package com.lkm.javatool;

import java.math.BigDecimal;

/**
 * 进制，数
 * Created by lkm on 17/4/12.
 */

public class NumberHelp {


    //偷懒使用BigInteger将字节数组转化为2进制字符串，发现BigInteger会省略前面的几个0
//    public static String bytesTohex(byte[] bytes)
//    {
//        /**
//         * 第一个参数的解释，记得一定要设置为1
//         *  signum of the number (-1 for negative, 0 for zero, 1 for positive).
//         */
//        BigInteger bigInteger = new BigInteger(1, bytes);
//        return bigInteger.toString(16);
//    }

    /**
     * 字节转16进制
     *  一般用的是高位在前
     * @param bytes 高位在前.[0]高
     * @return
     */
    public static String bytesTohexDesc(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
//        String tmp = null;
        for (byte b : bytes) {
            // 将每个字节与0xFF进行与运算，然后转化为10进制，然后借助于Integer再转化为16进制
            String tmp = Integer.toHexString(0xFF & b);
            if (tmp.length() == 1)// 每个字节8为，转为16进制标志，2个16进制位
            {
                sb.append("0");//tmp = "0" + tmp;
            }
            sb.append(tmp);
        }

        return sb.toString();
    }
    /**
     * 字节转16进制
     *
     * @param bytes 低位在前
     * @return
     */
    public static String bytesTohexAsc(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        String tmp = null;
        for (int i = bytes.length-1; i > -1; i--) {
            byte b = bytes[i];
//        }
//        for (byte b : bytes) {
            // 将每个字节与0xFF进行与运算，然后转化为10进制，然后借助于Integer再转化为16进制
            tmp = Integer.toHexString(0xFF & b);
            if (tmp.length() == 1)// 每个字节8为，转为16进制标志，2个16进制位
            {
                tmp = "0" + tmp;
            }
            sb.append(tmp);
        }

        return sb.toString();
    }
    public static String bytesToHex(byte data) {
        String hex = Integer.toHexString(data & 255);
        if (hex.length() == 1) {
            return '0' + hex;
        }
        if (hex.length() > 2) {
            return hex.substring(hex.length() - 2, hex.length());
        }
        return hex;
    }


    /**
     * 低位在前[0]，高位在后[3])的顺序
     *一般用的是高位在前
     * @param b
     * @return
     */
    public static int bytesToIntAsc(byte[] b) {
        int result=b[0] & 0xFF;
        for (int i = 1; i <b.length ; i++) {
            result|=(b[i] & 0xFF) << (i*8);
        }
//        b[0] & 0xFF |
//                (b[1] & 0xFF) << 8 |
//                (b[2] & 0xFF) << 16 |
//                (b[3] & 0xFF) << 24;
        return result;
    }
    /**
     * 高位在前[0]，低位在后[3])的顺序
     *一般用的是高位在前
     * @param b
     * @return
     */
    public static int bytesToIntDesc(byte[] b) {
        int result=0;//b[0] & 0xFF;
        for (int i = 0; i <b.length ; i++) {
            //假设b长度是3， 那么i最大是2，这时 3-2-1才会等于0 这是最低位的。
            result|=(b[i] & 0xFF) << ((b.length - i-1)*8);
        }
        return result;
    }

    /**
     *(低位在前[0]，高位在后[3])的顺序
     *
     * @param a
     * @return 4长度的byte数值
     */
    public static byte[] intToBytesAsc(int a) {
        return new byte[]{
                (byte) (a & 0xFF),
                (byte) ((a >> 8) & 0xFF),
                (byte) ((a >> 16) & 0xFF),
                (byte) ((a >> 24) & 0xFF)

        };
    }
    /**
     *(高位在前[0]，低位在后[3])的顺序
     *
     * @param a
     * @return 4长度的byte数值
     */
    public static byte[] intToBytesDesc(int a) {
        return new byte[]{
                (byte) ((a >> 24) & 0xFF),
                (byte) ((a >> 16) & 0xFF),
                (byte) ((a >> 8) & 0xFF),
                (byte) (a & 0xFF)
        };
    }

    /**
     * 字符串转整数
     *
     * @param str
     * @param defValue
     * @return
     */
    public static int toInt(String str, int defValue) {
        try {
            return Integer.parseInt(str);
        } catch (Exception e) {
        }
        return defValue;
    }

    public static  double doubleScale( double value, int scale, int roundingMode) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(scale, roundingMode);//BigDecimal.ROUND_HALF_DOWN);
        float d = bd.floatValue();
        return d;
    }
    public static String doubleScaleToString(float value, int scale, int roundingMode) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(scale, roundingMode);//BigDecimal.ROUND_HALF_DOWN);
        float d = bd.floatValue();
        return String .format("%."+scale+"f",d);
    }

    //格式化金额的显示
    public static String formatMoney(float value, int scale) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(scale, BigDecimal.ROUND_HALF_DOWN);
        float d = bd.floatValue();
        return String .format("%."+scale+"f",d);
    }
    public static float floatScale(float value, int scale, int roundingMode) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(scale, roundingMode);
        float d = bd.floatValue();
        return d;
    }
}
